#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <syslog.h>
#include <errno.h>

#define BUFSIZE     128
#define FILENAME    "/dev/null"
#define OUTFILE     "/tmp/out.txt"

int mydaemon(void);

int main(void)
{
    FILE *fp = NULL;
    time_t rawtime;
    struct tm *timeinfo;
    char buf[BUFSIZE];


    openlog(NULL, LOG_PID, LOG_DAEMON); // 创建日志连接

    if (-1 == mydaemon()) { // 守护进程
        //fprintf(stderr, "mydaemon()");
        syslog(LOG_ERR, "mydaemon() error"); // 输出日志
        return 1;
    }

    fp = fopen(OUTFILE, "w");
    if (NULL == fp) {
        //perror("open()");
        syslog(LOG_ERR, "open():%s", strerror(errno));
        return 1;
    }

    while (1) {
        time(&rawtime); // 获取当前时间
        timeinfo = localtime(&rawtime);
        if (NULL == timeinfo) {
            //perror("localtime()");
            syslog(LOG_ERR, "localtime():%s", strerror(errno));
            return 1;
        }
        // 格式化时间为字符串
        strftime(buf, sizeof(buf), "%Y/%m/%d %H:%M:%S", timeinfo);

        fseek(fp, 0, SEEK_SET);
        fprintf(fp, "%s\n", buf);
        fflush(fp);

        memset(buf, '\0', BUFSIZE);
        sleep(1);
    }

    fclose(fp);
    return 0;
}

int mydaemon(void)
{
    pid_t pid;
    int fd;

    umask(0);

    pid = fork();

    if (-1 == pid) {
        //perror("fork()");
        syslog(LOG_ERR, "fork():%s", strerror(errno));
        return -1;
    }

    if (pid > 0) 
        _exit(0); // 父进程直接终止

    if (-1 == setsid()) {
        //perror("setsid()");
        syslog(LOG_ERR, "setsid():%s", strerror(errno));
        return -1;
    }

    chdir("/"); // 切换工作路径

    // 关闭不必要的文件......


    fd = open(FILENAME, O_RDWR);
    if (-1 == fd) {
        //perror("open()");
        syslog(LOG_ERR, "open():%s", strerror(errno));
        return -1;
    }

    dup2(fd, 0);
    dup2(fd, 1);
    dup2(fd, 2);

    return 0;
}
